Skip to content

Server(fix[new_session]): Harden error handling and TMUX env restoration#628

Draft
tony wants to merge 1 commit intomasterfrom
fix/session-env-restoration
Draft

Server(fix[new_session]): Harden error handling and TMUX env restoration#628
tony wants to merge 1 commit intomasterfrom
fix/session-env-restoration

Conversation

@tony
Copy link
Copy Markdown
Member

@tony tony commented Feb 9, 2026

Summary

  • new_session() deletes os.environ["TMUX"] before calling tmux but only restores it on the success path — any exception permanently leaks the deletion. This wraps all post-deletion code in try/finally.
  • proc.stdout[0] raises an unhelpful IndexError if tmux produces no output. This adds an explicit guard with a descriptive LibTmuxException.

Split out from #576 — hardening that's independent of the race condition fix itself.

Changes

src/libtmux/server.py:

  • Wrap all code after del os.environ["TMUX"] in try/finally to ensure restoration on any exception (including setup-phase errors like pathlib.Path.expanduser())
  • Guard against empty proc.stdout with descriptive LibTmuxException

tests/test_server.py:

  • test_new_session_empty_stdout — verifies error on empty stdout
  • test_new_session_restores_tmux_env_on_error — verifies TMUX restored after cmd error
  • test_new_session_restores_tmux_env_on_setup_error — verifies TMUX restored after setup-phase error

Test plan

  • uv run pytest — 875 passed, 1 skipped
  • uv run ruff check . — all checks passed
  • uv run mypy src tests — no issues

@codecov
Copy link
Copy Markdown

codecov Bot commented Feb 9, 2026

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 46.90%. Comparing base (81d55fa) to head (4012283).

Additional details and impacted files
@@            Coverage Diff             @@
##           master     #628      +/-   ##
==========================================
+ Coverage   46.58%   46.90%   +0.32%     
==========================================
  Files          22       22              
  Lines        2372     2375       +3     
  Branches      390      391       +1     
==========================================
+ Hits         1105     1114       +9     
+ Misses       1098     1093       -5     
+ Partials      169      168       -1     

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

… empty

why: Server.new_session reads session_stdout via proc.stdout[0] without
checking that proc.stdout has any elements. If tmux returns empty stdout
(without writing to stderr — corrupt pipe, kernel-level signal mid-write,
mocked transport), this raises an unhelpful IndexError instead of a
branded LibTmuxException. The TMUX env restoration was already wrapped
in try/finally on master, but the empty-stdout guard was missing.
what:
- add 'if not proc.stdout: raise LibTmuxException' check before indexing
  proc.stdout[0]
- add tests for empty stdout, TMUX env restoration on cmd-side errors,
  and TMUX env restoration on setup-phase errors (to verify the existing
  try/finally covers arg-building, not just the cmd() call)
- tests use monkeypatch per CLAUDE.md (cannot trigger empty stdout from
  a healthy tmux server otherwise)
@tony tony force-pushed the fix/session-env-restoration branch from a74c602 to 4012283 Compare April 26, 2026 11:27
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant